#include "horaire.h"
#include <QString>
#include <QUrl>
#include <QNetworkAccessManager>
#include <QDebug>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QRegExp>
#include <QStringList>

/*



  Il reste du taf sur cette class
   Au niveau de la logique ca fonctionne correctement, mais c'est un peu le bordel !!

  _Gerer correctement les "passage imminent" && les horaires de nuit type "prochain passage à 6h29"
    => Trouver cmt faire des regexp complexe
    => Ou sinon grab ce qui est entre balise html "de passage "et filtrer ce qui m'interesse,
        si filtre marche pas on affiche le contenu de la balise

  _Faire un peu de ménage !!!
  _Ajouter des commentaires

  */


horaire::horaire(QString code_timeo,QObject *parent):QObject(parent)
{
    sendIt = false;
    _code_timeo = code_timeo;
    //qDebug() << "\nCode Timeo = " << code_timeo;
    manager = new QNetworkAccessManager(this);
    url_principale = QUrl("http://setram.mobi/pivk/relais.html.php");
    connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(reponse_recu(QNetworkReply*)));
    connect(this,SIGNAL(Ready2Refresh()),this,SLOT(Refresh()));
    connect(this,SIGNAL(IsRefreshed()),this,SLOT(extraire_horaire()));
    Get_Passage();



}

void horaire::Get_Passage()
{

    parametres_post = "a=recherche_code&code=" + _code_timeo;
    this->Post_It(url_principale,parametres_post);


//        parametres_post = "a=refresh&"+param_refs +"&" + param_ran;
//        //qDebug() << parametres_post << "\n";
//        this->Post_It(url_principale,parametres_post);
//        //qDebug() << contenu_reponse;

}




void horaire::Post_It(QUrl url, QString parametres)
{
QNetworkRequest requete;
//qDebug() << "\nUrl_Principal ="<<url;
//parametres_post = "a=recherche_code&code=" + _code_timeo;
//qDebug() << "\nParametre_post ="<<parametres;
requete.setUrl(url);
requete.setRawHeader("User-Agent","Mozilla/5.0 (iPod; U; CPU iPhone OS 2_1 like Mac OS X; fr-fr) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5F137 Safari/525.20");
requete.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");
QNetworkReply *reponse = manager->post(requete,parametres.toUtf8());

//En cas d'erreur
connect (reponse,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(Erreur(QNetworkReply::NetworkError)));

}


void horaire::reponse_recu(QNetworkReply *reponse)
{
    if (reponse->error()==QNetworkReply::NoError)
    {
        contenu_reponse = reponse->readAll();
        if ( param_ran.isEmpty() || param_refs.isEmpty())
        {
            extraire_parametre_ajax();
        }
        else
        {
        emit IsRefreshed();
        }
    }



}

void horaire::Refresh()
{
    is_ready=0;

parametres_post = "a=refresh&"+param_refs +"&" + param_ran;
this->Post_It(url_principale,parametres_post);

}

void horaire::extraire_horaire()
{
    if (!contenu_reponse.isEmpty())
    {
    //qDebug() << "extraire horaire :\n" << contenu_reponse;
        //qDebug("Fonction extraire_horaire");


    //Extraction et stockage du nom de l'arret
    QRegExp Exp_nom_arret("\\W(\\w*)\\s\\Wi");
    Exp_nom_arret.indexIn(contenu_reponse);
    Horaire_Timeo.Nom_Arret = Exp_nom_arret.cap(1);

    //Extraction et stockage du numéro de la ligne
    QRegExp Exp_ligne("(?:Ligne)\\s(\\w+)");
    Exp_ligne.indexIn(contenu_reponse);
    Horaire_Timeo.Ligne = Exp_ligne.cap(1);

    //Extraction et stockage du Prochain passage - temps_restant & Direction
    QRegExp Exp_minutes_dst("\\Wh0\\W{1,2}.*(\\d{1,2}).*<");
    //qDebug()<< Exp_minutes_dst.errorString();
    int position = 0;
    position = Exp_minutes_dst.indexIn(contenu_reponse);
    Horaire_Timeo.Prochain.temps_restant = Exp_minutes_dst.cap(1);
    //qDebug()<< Exp_minutes_dst.errorString();



        //Extraction de la direction
        QRegExp Exp_Direction_Prochain("pour\\s(\\w*)\\s");
        Exp_Direction_Prochain.indexIn(contenu_reponse,position);
        Horaire_Timeo.Prochain.Direction = Exp_Direction_Prochain.cap(1);


//TODO: trouver une meilleure expression réguliere qui fonctionne à chaque fois

    //Extraction et stockage du passage SUIVANT;
    QRegExp Exp_minutes_dst2("\\Wh1\\W{1,2}.*(\\d{1,2}).*<");
    position = 0;
    position = Exp_minutes_dst2.lastIndexIn(contenu_reponse);
    Horaire_Timeo.Suivant.temps_restant = Exp_minutes_dst2.cap(1);

        //Extraction de la direction
        QRegExp Exp_Direction_Suivant("pour\\s(\\w*)\\s");
        Exp_Direction_Suivant.lastIndexIn(contenu_reponse);
        Horaire_Timeo.Suivant.Direction = Exp_Direction_Suivant.cap(1);

    //qDebug() << "\nLigne:"<< Horaire_Timeo.Ligne;
    //qDebug() << "\nPassage_1:"<<Horaire_Timeo.Prochain.temps_restant << Horaire_Timeo.Prochain.Direction;
    //qDebug()<< "\nPassage_2:"<<Horaire_Timeo.Suivant.temps_restant << Horaire_Timeo.Suivant.Direction;
   // emit FreshMeat();
   //SendHoraireStruct(Horaire_Timeo);
        //emit SendHoraireString("Arret:<b>"+ Horaire_Timeo.Nom_Arret+"</b> Ligne:<i>"+ Horaire_Timeo.Ligne+"</i><br>Dans "+ Horaire_Timeo.Prochain.temps_restant +" minutes vers "+ Horaire_Timeo.Prochain.Direction +"<br>Dans "+Horaire_Timeo.Suivant.temps_restant+" minutes vers "+ Horaire_Timeo.Suivant.Direction);
       // emit SendHoraireString("<i>["+Horaire_Timeo.Ligne+"]"+Horaire_Timeo.Nom_Arret+"</i><br>"+Horaire_Timeo.Prochain.temps_restant+"min vers "+Horaire_Timeo.Prochain.Direction+"<br>"+Horaire_Timeo.Suivant.temps_restant+"min vers"+Horaire_Timeo.Suivant.Direction);
        if (sendIt)
        {
        g_resultat = "["+ this->Horaire_Timeo.Ligne +"] "+ Horaire_Timeo.Nom_Arret+"\n"+Horaire_Timeo.Prochain.temps_restant +" minutes vers "+Horaire_Timeo.Prochain.Direction +"\n"+Horaire_Timeo.Suivant.temps_restant +" minutes vers "+Horaire_Timeo.Suivant.Direction+ "\n";
        //qDebug()<< g_resultat;

        emit Refresh_as_texte_by_id_lstring(id_lstring,g_resultat);

        //qDebug()<< _code_timeo << g_resultat;
        g_resultat.clear();
        }
}
    // dans 4 minutes /dans\W(\d{1,2})/
    // 4 ANTARES    (\d{1,2})\s\w+\s\w+\s([A-Z]*)
    //ligne /(?:Ligne)\s(\w+)/
    //   /dans\s(\d{1,2})||(imminent)/

}

void horaire::extraire_parametre_ajax()
{

    if (!contenu_reponse.isEmpty())
    {
  //  qDebug()<< "Fonction Extraire parametres" << contenu_reponse;

    QRegExp Exp_refs("refs\\W(\\d*)");
    QRegExp Exp_a("ran\\W(\\d*)");

    int pos = 0;
    if ((pos = Exp_refs.indexIn(contenu_reponse,pos) != -1) && (Exp_a.indexIn(contenu_reponse,pos)) != -1)
    {
       // //qDebug() << param_url_ajax.cap(pos);
       // pos =+ param_url_ajax.matchedLength();
        param_refs = Exp_refs.cap(0);
        param_ran = Exp_a.cap(0);
        //qDebug() << param_refs;
        //qDebug() << param_ran ;

    }else

    {
        //qDebug() << "Erreur pendant l'extraction des parametres de l'url ajax\n" << Exp_refs.errorString();
        qDebug()<< "Erreur arret"<<_code_timeo<<"\tSupprimer l'arret";
        emit erreur("[Erreur]Mauvais code :"+ _code_timeo+"\nSupprimez ce code");
        return;
    }

    if (!param_refs.isEmpty() && !param_ran.isEmpty())
    {
        emit Ready2Refresh();

    }
        extraire_horaire();
    }
}


//requete.

void horaire::Erreur(QNetworkReply::NetworkError code)
{


    qWarning()<< "Erreur HTTP : "<< code;
}



        // /refs\W(\d*)\C{9}(\d*)/ preg_match_all

void horaire::refresh_as_text(int id_l_string)
{
   this->id_lstring = id_l_string;
    this->sendIt = true;
   Refresh();
}




